<?php

namespace Sbm;

/**
 * Список задач крона
 * Задачи можно добавить методом SetFromDB(&$db,$limit) , или по одной методом Add( &$data );
 * 
 * @method SetFromDB(&$db, $limit) - получет список задач из базы данных
 * @method Add( $task ) - добавляет задачу в список
 * @method GetTask() - возвращает следующую задачу из списка  
 */
class TaskList
{

	/**
	 * Список задач
	 * 
	 * @var array
	 */
	private $data;

	/**
	 * Конструктор списка задач
	 * 
	 * @return TaskList
	 */
	function __construct()
	{
		$this->data = array();
	}

	/**
	 * Получаем список задач из таблицы sms_queue
	 * 
	 * @param DB $db
	 * @param int $limit=5
	 * @return 
	 */
	public function SetFromDB( $db, $limit = 5 )
	{
		$s = "SELECT 
		            * 
		    FROM 
		            `{queue}` 
		    WHERE 
		            `status` = 'new' 
		    ORDER BY 
		            `datetime` ASC 
		    LIMIT 
		            " . $limit;
		$q = $db->Query($s);
		while ($r = $q->FetchRow())
		{
			$task_type = $r['type'];
			$task_classname = ucwords($task_type);
			$task_data = json_decode($r['object']);
			if ( !class_exists($task_classname) )
			{
				$task_classname = 'Task';
			}
			$task = new $task_classname($task_data);
			$this->Add($task);
		}
		$this->Reset();
	}

	/**
	 * Добавляет задачу к списку
	 * 
	 * @param Task $item
	 * @return void
	 */
	function Add( $item )
	{
		$this->data[] = &$item;
	}

	/**
	 * Возврщает задачу из списка, и передвигает указатель
	 * 
	 * @return Task
	 */
	function GetTask()
	{
		$result = current($this->data);
		next($this->data);
		return $result;
	}

	/**
	 * Сбрасывает указатель на начало списка
	 * 
	 * @return void
	 */
	function Reset()
	{
		reset($this->data);
	}

}

/**
 * Задача
 * @author Zoggi
 * 
 * @method Run() - запускает задачу
 * @method SetComplete() - ставит в БД, отметку что задача выполнена
 */
class Task
{

	function __construct( $data )
	{
		
	}

	private function Run()
	{
		trigger_error("Empty task runned", E_USER_NOTICE);
	}

	function SetComplete()
	{
		
	}

	/**
	 * Сохраняет задачу в БД, и возвращает её ID
	 * @param DB $db
	 * @return id
	 */
	function Save( $db )
	{
		
	}

}

?>